home *** CD-ROM | disk | FTP | other *** search
- // ===============================================================
- // Vertex Program:
- // Description:
- // Last Update: 14/08/2003
- // Coder: Andrey Honich
- // ===============================================================
-
- #include "../CGVPMacro.csi"
-
-
- NoFog
- MainInput
- {
- VIEWPROJ_MATRIX,
- CAMERA_POS,
- uniform float4 PosScale,
- uniform float4 PosOffset,
- uniform float3 ColorMinFresnel,
- uniform float3 ColorMaxFresnel,
- uniform float4 RippleTexGen0,
- uniform float4 RippleTexGen1,
- uniform float4x4 ReflectMatrix,
- uniform float4 Constants,
- uniform float4 WaterParams
- }
- DeclarationsScript
- {
- // define inputs from application
- struct appin
- {
- float4 Position : POSITION;
- float3 Normal : NORMAL;
- float HeightMap : BLENDWEIGHT;
- };
-
- // define outputs from vertex shader
- struct vertout
- {
- float4 HPosition : POSITION;
- float4 Tex0 : TEXCOORD0;
- float4 Tex1 : TEXCOORD1;
- float4 Color : COLOR0;
- float3 Color1 : COLOR1;
- float FogC : FOG;
- };
- }
- CoreScript
- {
- float4 vPos = IN.Position * PosScale;
-
- // Apply curvature
- float4 vCam = vPos - CameraPos;
- vCam.z = 0;
- float fSqCamDist = dot(vCam, vCam);
- vPos.z = vPos.z + Constants.x * -fSqCamDist;
-
- // Scale height of the wave and normal depending on the water deep
- float fHeightDelta = WaterParams.x - IN.HeightMap;
- OUT.Color.w = fHeightDelta * WaterParams.w;
- float fHeightScale = clamp(fHeightDelta * WaterParams.z, 0, 1);
- vPos.z = vPos.z * fHeightScale;
- float3 normal = IN.Normal;
- normal.xy = normal.xy * fHeightScale;
- normal = normalize(normal);
-
- // Calculate fog
- float4 posReal = vPos;
- posReal.z = posReal.z + WaterParams.x;
- vCam = posReal - CameraPos;
- float fiDist = rsqrt(dot(vCam, vCam));
- float fDist = 1 / fiDist;
- OUT.FogC = fDist;
-
- // Don't deform near to camera
- float fScale = step(8, fDist);
- vPos.z = vPos.z * fScale + WaterParams.x;
-
- // Normalize camera vector
- vCam.xyz = vCam.xyz * fiDist;
-
- // Two sided lighting
- float fDotNorm = dot(vCam.xyz, normal);
- fDotNorm = fDotNorm * sign(fDotNorm);
-
- // calculate approximated fresnel term F
- // 1
- // F = ---------------------------
- // ( 1 + E.N ) ^ Fresnel_Power_Factor
- OUT.Color.xyz = fDotNorm.xxx;
- float fFresnel = 1 / pow((fDotNorm + 1), Constants.y);
- OUT.Color1.xyz = lerp(ColorMinFresnel, ColorMaxFresnel, fFresnel);
-
- OUT.HPosition = mul(ModelViewProj, vPos);
-
- OUT.Tex0.x = dot(vPos, RippleTexGen0);
- OUT.Tex0.y = dot(vPos, RippleTexGen1);
-
- float4 vTexRefl = mul(ReflectMatrix, vPos);
- OUT.Tex1.xy = vTexRefl.xy * (1 / vTexRefl.w);
- }
-